/**
 * 名称：清空鼠标事件
 * 说明：讲创建的鼠标事件进行清空
 * 参数：
 * 状态：已完成
 * 负责人：/
 * 网址：https://blog.csdn.net/weixin_44058725/article/details/105856045
 */
const deleteHandlerFu = () => {
  if(handler) {
    console.log('开始删除')
    handler.removeInputAction(Cesium.ScreenSpaceEventType.RIGHT_CLICK)
    handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK)
    handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOWN)
    handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_UP)
    handler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE)
    handler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE)
  } else {
    createHandler()
  }
}

/**
 * 名称：获取鼠标点击位置
 * 说明：根据点击的位置在屏幕上展示对应的坐标信息
 * 参数：
 * 状态：已完成
 * 负责人：/
 * 网址：
 */
function getModelPosition() {
  handler.setInputAction(function(evt) {
    viewer.entities.removeAll()
    let position = viewer.scene.pickPosition(evt.position)
    viewer.entities.add({
      id: 1,
      position: position,
      point: {
        color: Cesium.Color.WHEAT,
        pixelSize: 5,
        outlineWidth: 3,
        disableDepthTestDistance: Number.POSITIVE_INFINITY
        // heightReference: Cesium.HeightReference.CLAMP_TO_GROUND // 规定贴地
      }
    })
    console.log('位置信息：', position)
    addLabel(position, 'X：' + position['x'] + ',Y：' + position['y'] + ',Z：' + position['z'])
  }, Cesium.ScreenSpaceEventType.LEFT_CLICK)
}

/**
 * 名称：开启贴地模式
 * 说明：开启贴地模式，在创建的时候去点击不会将物体创建到实体上面，而是直接创建到地面上
 * 参数：
 * 状态：已完成
 * 负责人：/
 * 网址：
 */
function deepInspectionOpen(status) {
  console.log('深度检测状态：', status)
  viewer.scene.globe.depthTestAgainstTerrain = status
}

/**
 * 名称：检测是否点击到模型上
 * 说明：当有功能在区分点击在地图或者模型上的时候可以使用进行区分
 * 参数：
 * 状态：已完成
 * 负责人：/
 * 网址：
 */
function distinguishingModelsFromMaps(endPosition) {
  // 进入传入的经纬度判断所点击的位置是否为模型还是地图
  const pickedFeature = viewer.scene.pick(endPosition)
  console.log('正在进行地图与模型的区分操作：', Cesium.defined(pickedFeature))
  return Cesium.defined(pickedFeature)
}

/**
 * 名称：坐标拾取
 * 说明：拾取位置点，能够根据鼠标位置判断出是画在3dtils上，还是画在地球上，还是画在地形上
 * 参数： px： 屏幕坐标
 * 返回值：Cartesian3 三维坐标
 * 负责人：/
 * 网址：http://www.5imoban.net/jiaocheng/mapgis/202106224870.html
 */
function getCatesian3FromPX(px) {
  if(viewer && px) {
    var picks = viewer.scene.drillPick(px)
    var cartesian = null
    var isOn3dtiles = false, isOnTerrain = false
    // drillPick
    for(let i in picks) {
      let pick = picks[i]
      if(
        (pick && pick.primitive instanceof Cesium.Cesium3DTileFeature) ||
        (pick && pick.primitive instanceof Cesium.Cesium3DTileset) ||
        (pick && pick.primitive instanceof Cesium.Model)
      ) {
        //模型上拾取
        isOn3dtiles = true
      }
      // 3dtilset
      if(isOn3dtiles) {
        console.error('选中的是3dtilset')
        viewer.scene.pick(px) // pick
        cartesian = viewer.scene.pickPosition(px)
        if(cartesian) {
          let cartographic = Cesium.Cartographic.fromCartesian(cartesian)
          if(cartographic.height < 0) cartographic.height = 0
          let lon = Cesium.Math.toDegrees(cartographic.longitude),
            lat = Cesium.Math.toDegrees(cartographic.latitude),
            height = cartographic.height
          cartesian = this.transformWGS84ToCartesian({
            lng: lon,
            lat: lat,
            alt: height
          })
        }
      }
    }
    // 地形
    let boolTerrain =
      viewer.terrainProvider instanceof
      Cesium.EllipsoidTerrainProvider
    // Terrain
    if(!isOn3dtiles && !boolTerrain) {
      console.error('选中的是地形')
      var ray = viewer.scene.camera.getPickRay(px)
      if(!ray) return null
      cartesian = viewer.scene.globe.pick(ray, viewer.scene)
      isOnTerrain = true
    }
    // 地球
    if(!isOn3dtiles && !isOnTerrain && boolTerrain) {
      console.error('选中的是地球')
      cartesian = viewer.scene.camera.pickEllipsoid(
        px,
        viewer.scene.globe.ellipsoid
      )
    }
    if(cartesian) {
      let position = this.transformCartesianToWGS84(cartesian)
      if(position.alt < 0) {
        cartesian = this.transformWGS84ToCartesian(position, 0.1)
      }
      return cartesian
    }
    return false
  }
}

/**
 * 名称：坐标转换 笛卡尔转84
 * 说明：坐标转换 笛卡尔转84
 * 参数： cartesian： 三维位置坐标
 * 返回值：{lng,lat,alt} 地理坐标
 * 负责人：/
 * 网址：http://www.5imoban.net/jiaocheng/mapgis/202106224870.html
 */
function transformCartesianToWGS84(cartesian) {
  if(viewer && cartesian) {
    var ellipsoid = Cesium.Ellipsoid.WGS84
    var cartographic = ellipsoid.cartesianToCartographic(cartesian)
    return {
      lng: Cesium.Math.toDegrees(cartographic.longitude),
      lat: Cesium.Math.toDegrees(cartographic.latitude),
      alt: cartographic.height
    }
  }
}

/**
 * 名称：坐标转换 笛卡尔转84
 * 说明：坐标转换 笛卡尔转84
 * 参数： position： 三维位置坐标
 * 返回值：Cartesian3 三维位置坐标
 * 负责人：/
 * 网址：http://www.5imoban.net/jiaocheng/mapgis/202106224870.html
 */
function transformWGS84ToCartesian(position, alt) {
  if(viewer) {
    return position ?
      Cesium.Cartesian3.fromDegrees(
        position.lng || position.lon,
        position.lat,
        position.alt = alt || position.alt,
        Cesium.Ellipsoid.WGS84
      ) :
      Cesium.Cartesian3.ZERO
  }
}

/**
 * 名称：世界坐标转屏幕坐标
 * 说明：世界坐标转屏幕坐标
 * 参数： position： 三维位置坐标
 * 负责人：/
 * 网址：https://blog.csdn.net/qq_17627195/article/details/127412829
 */
function convertToScreenCoordinates(position) {
  Cartesian = Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene, position)
  let lon = Cartesian.x.toFixed(2)	// 经度
  let lat = Cartesian.y.toFixed(2)	// 纬度
  console.error('世界坐标转屏幕坐标：', lon, lat)
  return { x: lon, y: lat }
}

/**
 * 名称：开启屏幕提示语
 * 说明：根据传入的坐标与文字进行提示语的展示
 * 参数：position:三维坐标，text：提示词
 * 负责人：/
 * 网址：https://blog.csdn.net/qq_17627195/article/details/127412829
 */
function openPrompt(position, text) {
  var tooltip = document.getElementById('toolTip')
  tooltip.style.display = 'block'
  tooltip.style.left = position.x + 440 + 'px'
  tooltip.style.top = position.y + 30 + 'px'
  tooltip.innerHTML = '<p>' + text + '</p>'
}

/**
 * 名称：关闭屏幕提示语
 * 说明：关闭屏幕提示语文本框
 * 参数：
 * 负责人：/
 * 网址：https://blog.csdn.net/qq_17627195/article/details/127412829
 */
function closePrompt() {
  var tooltip = document.getElementById('toolTip')
  tooltip.style.display = 'none'
}

/**
 * 名称：返回主视角
 * 说明：返回初始视点，并对操作进行关闭
 * 参数：
 * 负责人：/
 * 网址：
 */
function mainPerspective() {
  viewer.zoomTo(tileset, new Cesium.HeadingPitchRange(0.0, -0.5, tileset.boundingSphere.radius * 2.0))
  // 退出平剖
  exitSlicing()
}

/**
 * 名称：绘制线
 * 说明：可以绘制多种线，需要根据Type来进行决定
 * 参数：type: 0直线，1虚线
 * 负责人：/
 * 网址：https://blog.csdn.net/qq_17627195/article/details/127412829
 */
function drawLinesArr(positions, type) {
  console.log('开始创建线type:', type)
  let length = 0
  switch(type) {
    case 0:
      length = 0
      break
    case 1:
      length = 20
      break
  }
  if(positions.length < 1) return
  return viewer.entities.add({
    polyline: {
      positions: positions,
      width: 3,
      material: new Cesium.PolylineDashMaterialProperty({
        color: Cesium.Color.YELLOW,
        dashLength: length //短划线长度
      }),
      depthFailMaterial: new Cesium.PolylineGlowMaterialProperty({
        // eslint-disable-next-line new-cap
        color: Cesium.Color.WHEAT
      })
    }
  })
}

/**
 * 名称：对坐标进行偏移
 * 说明：根据传入的坐标与偏移量来进行偏移大小的指定
 * 参数：positionsone：起点（左边点）, positionstwo：终点（右边点）, length:偏移长度
 * 状态：已完成
 * 负责人：/
 * 网址：
 */
function getTranslationalCoordinates(positionOne, positionTwo, length) {
  console.log('查看数据：', positionOne, positionTwo, length)
  let piont = Cesium.Cartesian3.subtract(positionOne, positionTwo, new Cesium.Cartesian3())
  let normal = Cesium.Cartesian3.normalize(piont, new Cesium.Cartesian3())
  let data = {
    x: length * normal.x + positionTwo.x,
    y: length * normal.y + positionTwo.y,
    z: length * normal.z + positionTwo.z
  }
  return data
}

/**
 * 名称：获取相机在世界坐标中的位置
 * 作用：保存视点
 * 状态：已完成
 * 参数：
 * @return {{position: *, up: *, right: *, viewMatrix: *, direction: *}}
 * 负责人：刘洮君
 */
const getCameraCoordinate = () => {
  const camera = viewer.camera
  console.log('camera', camera)
  const position = camera.position.clone()
  const heading = camera.heading
  const pitch = camera.pitch
  const roll = camera.roll
  const viewMatrix = camera.viewMatrix.clone()
  return {
    // 跳转，只需要 position,direction, up三个 或者是 heading, pitch,  roll,三个就够了
    position: position,
    heading, // 观察点左右
    pitch, // 上下
    roll,
    viewMatrix: viewMatrix
  }
}

/**
 * 创建自定义文本框
 * 作用：通过传入的数据用画布将其转为图片，然后再创建cesium实体(兼顾着数据存储使用，当时要记录多个创建的实体的时候需要放开延时功能，就可以将数据进行一个存储)
 * position：标签坐标
 *         error = {
 *             status: true,// 状态
 *             number: 10,// 报错数字
 *             size:10,// 圆圈大小
 *             textSiz:10// 文字大小
 *         }
 *        text = {
 *            textArr: ['这是第一行','这是第二行','这是第三行'],// 标签内容
 *            textName: '这是第一行',// 标签文字
 *            textX:70,// 标签X轴位置
 *            textY:30,// 标签y轴位置
 *            textSize:20,// 标签字体大小
 *            textHeight: 20// 标签字体换行高度
 *        }
 *        background = {
 *            backgroundImage: './Source/Images/label/green.png',// 标签背景图片
 *            height:50,// 标签背景图片高度
 *            width:300// 标签背景图片宽度
 *        }
 *        status = true/false(是否存储诗句)
 * 状态：已完成
 * 负责人：
 */
// 记录创建的所有实体，在删除的时候使用
let recordAddAllEntity = []
function createCustomBillboards(position, text, background, error, status) {
  console.log('查看传入的信息：', position, text, background, error)
  // 创建画布
  var canvas = document.createElement("canvas");
  // canvas.height = 50
  // canvas.width = 300
  canvas.height = background.height
  canvas.width = background.width
  var context = canvas.getContext('2d');
  var bgImg = new Image();
  // bgImg.src = './Source/Images/label/green.png';
  if (background.backgroundImage !='' ){
    bgImg.src = background.backgroundImage;
  }else {
    bgImg.src = 'https://img0.baidu.com/it/u=3572716333,3840267829&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=281';
  }
  console.log('进行绘制img')
  bgImg.onload = function(){
    // 绘制背景图片
    context.drawImage(bgImg, 0, 0, canvas.width, canvas.height);
    // 绘制文字
    if (text.textArr.length > 0){
      let y = text.textY
      for (const index in text.textArr) {
        context.fillStyle = "#FFFFFF";
        context.font = text.textSize + "px Arial";
        // 在这里的txtX += 20的作用就代表着换行
        context.fillText(text.textArr[index], text.textX, y)
        y += text.textHeight
      }
    }
    // 绘制报错圆圈
    if (error.status){
      context.beginPath();
      context.arc(canvas.width - error.size, error.size,error.size,0,2*Math.PI,true);
      context.fillStyle="red";
      context.fill();
      context.fillStyle = "#FFFFFF";
      context.font = error.textSiz + "px Arial";
      context.fillText(error.number, canvas.width - (error.size +error.size/2) -2, error.size+3)
    }
    // 将canvas转成图片
    let data = canvas.toDataURL('png')
    // 开始绘制标签实体
    let entities = viewer.entities.add({
      name: text.lebalName,
      position: position,
      billboard: {
        image: data,
        scaleByDistance: new Cesium.NearFarScalar(100, 1.0, 1000, 0.2)
      }
    })
    recordAddAllEntity.push(entities)
  }
}
